% -- Ping
\subsection{Primera Parte: Estimación de RTT vía ping}

En pos de poder estimar diversos tiempos de RTT sobre diferentes hosts a lo largo y ancho del planeta
se optó por tomar un conjunto representativo de Universidades distribuídas en diferentes
lugares del mapa. Para cada una se utilizó el nombre, el host y la distancia (en Km.)
desde Buenos Aires.

\begin{center}
  \begin{tabular}{l l r}
    Host & Descripción & Km \\
    \hline
    www.uc.cl & Pontificia Universidad Católica de Chile & 1107 \\
    www.uchile.cl & Universidad de Chile & 1128 \\
    www.uce.edu.ec & Universidad Central del Ecuador & 4253 \\
    www.uct.ac.za & University of Cape Town & 6839 \\
    web.mit.edu & Massachusetts Institute of Technology & 8668 \\
    www.utoronto.ca & Universidad de Toronto & 8993 \\
    www.stanford.edu & Stanford University & 10452 \\
    www.auckland.ac.nz & University of Auckland & 10547 \\
    www.ub.edu & Universitat de Barcelona & 10661 \\
    www.uni-muenster.de & University of Munster & 11520 \\
    cu.edu.eg & Cairo University & 11583 \\
    www.ox.ac.uk & University Of Oxford & 11592 \\
    sydney.edu.au & The University of Sydney & 11728 \\
    english.pku.edu.cn & Peking University & 11966 \\
    www.msu.ru & Lomonosov Moscow State University & 15452 \\
    www.shu.edu.cn & Shanghai University & 19530 \\
  \end{tabular}
\end{center}

Al intentar medir tiempos de RTT de un ping es altamente probable que dos mediciones sobre el mismo host
en un intervalo de tiempo chico den valores considerablemente diferentes. Esta diferencia muchas veces
está dada por la congestión de la red o por las diferentes rutas que pueden tomar cada uno de los paquetes.
Con lo cual una medición aislada no resulta representativa de la distancia de red entre el host origen y el destino.
Para achicar el margen de error se realizaron muchas mediciones sobre cada host y se tomó el promedio de todas ellas.
La Ley de los Grandes Números en Teoría de la Probabilidad nos garantiza que con una cantidad de muestras
considerablemente grande, el promedio del muestreo converge a la esperanza. El tamaño de la muestra
no es un valor fijo. En nuestro caso observamos empíricamente que alrededor de 100 mediciones resultaban satisfactorias.
Aumentar el muestreo no resultaba en una mejor aproximación.

Un detalle a tener el cuenta al promediar las mediciones de ping es definir de que manera tratar
los \textit{time-out}. Al realizar diversas pruebas preeliminares observamos que los tiempos de RTT
estaban mayormente muy por debajo de 1 segundo. La primer medida fue definir el timeout de la función
\texttt{ping} en 3 segundos. Con lo cual, si no se obtenía una respuesta en 3 segundos, se consideraba
el \texttt{echo-request} como finalizado por time-out.

En algunos casos la totalidad de las mediciones resultaban finalizadas por time-out. Pero había
otros casos en dónde algunas mediciones eran respondidas pero otras demoraban lo suficiente como
para considerarse finalizadas. Aumentar el tiempo de time-out por encima de los 3 segundos no
resultaba satisfactorio pues en 100 repeticiones de cada uno de los 17 hosts medidos el tiempo
total se incrementaba notablemente. Con lo cual tomamos como decisión que si un host tenía mediciones
concretas y algunas mediciones con time-out, éstas últimas no se tomaban en cuenta en el promedio
de los RTT. Por otro lado, los host con la totalidad de las mediciones con time-out, al momento
de graficarlas se las estableció con un tiempo de 1000ms. Esta decisión fue tomada en pos
de una mejor visualización de los datos en forma gráfica.

El algoritmo de la la implementación de \texttt{ping} recibe como argumentos
el host y la cantidad de repeticiones y devuelve el valor promedio de los RTT.
La función que realiza el ping puntual se basa en las funciones de \textit{Scapy}.

\lstset{language=python,title={ping},caption={ping(host, rep)}}
\begin{footnotesize}
  \begin{lstlisting}
  num_req = rep
  t_total = 0

  for x in range(rep):
    t0 = time()
    resp = ping(host)
    t1 = time()

    if resp == None:
      num_req -= 1
    else:
      t_total += t1 - t0		

  if num_req == 0:
    return INF

  return '%.3f' %(t_total/num_req * 10**3)
	
  def ping(host, debug = False):
    packet = IP(dst=host)/ICMP()
    verb = 0 if debug == False else None
    response = sr1(packet, verbose = verb, timeout = TIMEOUT)
    return response
  \end{lstlisting}
\end{footnotesize}

Como comparativa se realizaron tres mediciones en diferentes días y horarios. Éstas fueron tomadas
el domingo 20 de octubre alrededor de las 20hs, el lunes 21 de octubre a las 09hs y el martes 22 de octubre
a las 14hs. Al realizar las mediciones de nuestra implementación de \texttt{ping} también se calcularon,
bajo las mismas pautas (time-out, promedio, repeticiones), mediciones de RTT del ping de linux.
Los resultados pueden verse en la sección siguiente junto con el RTT teórico de la velocidad de
la fibra utilizando distancias rectilíneas entre el origen y los destinos.

Como se verá en los gráficos, las mediciones teóricas siempre están por debajo de los tiempos reales.
Esto es razonable y se considera como una cota inferior ya que se toman distancias en línea recta,
las cuales son menores a las distancias reales. Además no se toman en cuenta los tiempos deprocesamiento 
de paquetes, congestión y demás cuestiones.

\subsubsection{Mediciones}
\input{mediciones_ping.tex}

\subsubsection{Análisis de datos}
\input{analisis_ping.tex}

% -- Traceroute
\subsection{Segunda parte: traceroute sobre ICMP}

La implementación del \texttt{traceroute} se llevó a cabo bajo los mismos principios que \texttt{ping}.
Se arma un paquete \texttt{echo-request} con el host al que estamos apuntando, un TTL y un ID inicialmente
en 1. Se envía el paquete y se guarda el host-$i$ (aquel host intermedio entre nosotros y nuestro destino)
que efectúa la respuesta del \texttt{time exceedeed}. Si el host-$i$ llegase a no responder (timeout de 3 segundos)
se lo guarda como un host desconocido. Se intrementan el TTL y el ID y se repite el procedimiento.
El algoritmo termina cuando un host-$i$ envía respuestas a dos paquetes consecutivos distintos, 
en este caso se asume que no se puede avanzar más del host-$i$ y que no se pudo llegar al destino; 
otro caso de finalización es que el host que envía la respuesta sea el destino. 
Si no se cumplen esas condiciones se termina al alcanzar el máximo TTL. Por defecto lo seteamos en 30.

El \texttt{TTL} indica la cantidad de hops o saltos intermedios que se pueden realizar 
antes de descartar el paquete asumiendo que no existe el camino hasta el host destino.

\lstset{language=python,title={traceroute},caption={traceroute(host)}}
\begin{footnotesize}
  \begin{lstlisting}
#devuelve una lista de ips por los que pasan los paquetes
def traceroute(host, maxttl = 30):
  route = []
  p = IP(dst = host, ttl = 1, id = 1) / ICMP()
  ip = p.src
  lastip = ip

  for t in range(1,maxttl):
    p.ttl = t
    p.id = t

    resp = sr1(p, timeout = TIMEOUT)

    if resp == None:
      route.append("***")
    else:
      if resp.src == ip or resp.src == lastip:
	break

      route.append(resp.src)			
      lastip = resp.src

  return route
  \end{lstlisting}
\end{footnotesize}

\subsubsection{Mediciones}
\input{mediciones_traceroute.tex}

\subsubsection{Análisis de datos}
\input{analisis_traceroute.tex}
